package com.activiti;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.IdentityService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

/**
 * @author zhangbowen@heytea.com
 * @since 2020-05-22 10:53
 */
@Service
public class TestService {

    @Autowired
    private TaskService taskService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private IdentityService identityService;

    public String startProcess() {
        // TODO condition符合要求才可以开启实例

        // 设置变量值保证流程部署成功,但是全局变量容易遗忘，所以一般业务还是用局部的；全局变量的使用具体还是看业务
        Map<String, Object> variables = new HashMap<>();
        // 设置初始值扫描完整个流程（正常流程）
        variables.put("money", 3);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("createProcess", variables);

        // TODO 将项目id和processId关联起来，后面查询项目列表就知道当前项目id对应的processId是多少，并且知道后续操作的id
        return processInstance.getId();
    }

    public List<Task> getTasks(String processId, String assigneeId) {
        // 自定义用户系统;assigneeId==userId
        List<Task> assigneeTasks =
            taskService.createTaskQuery().processInstanceId(processId).taskAssignee(assigneeId).list();
        if (CollectionUtils.isEmpty(assigneeTasks)) {
            return taskService.createTaskQuery().processInstanceId(processId).taskUnassigned().list();
        }
        return assigneeTasks;
    }

    public void commitTaskPlanProject(String taskId, Integer money) {

        // Group group=identityService.createGroupQuery().groupId("经理ID").singleResult();
        // group.getId();
        // taskService.addCandidateGroup();

        // 申领任务，被申领后其他用户就看不到这个任务了，但是申领不等于完成
        taskService.claim(taskId, "9");

        // TODO 这里只做了驳回，并行交叉换不同控间就可以了，逻辑同理
        Map<String, Object> variables = new HashMap<>();
        // 全局变量
        variables.put("money", money);
        //TODO  指派用户走的监听器
        variables.put("userId", 10);

        taskService.complete(taskId, variables);
    }

    public void commitSignStart(String taskId) {

        taskService.complete(taskId);
    }
}
